home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995 February: Tool Chest / Dev.CD Feb 95 / Dev.CD Feb 95.toast / Tool Chest / Interfaces / Universal Interfaces 2.0a3 / Universal AIncludes / SCSI.a < prev    next >
Encoding:
Text File  |  1994-11-11  |  30.8 KB  |  870 lines  |  [TEXT/MPS ]

  1. ;
  2. ;    File:        SCSI.a
  3. ;
  4. ;    Copyright:    © 1984-1994 by Apple Computer, Inc.
  5. ;                All rights reserved.
  6. ;
  7. ;    Version:    Universal Interfaces 2.0a3  ETO #16, MPW prerelease.  Friday, November 11, 1994. 
  8. ;
  9. ;    Bugs?:        If you find a problem with this file, send the file and version
  10. ;                information (from above) and the problem description to:
  11. ;
  12. ;                    Internet:    apple.bugs@applelink.apple.com
  13. ;                    AppleLink:    APPLE.BUGS
  14. ;
  15. ;
  16.  
  17.     IF &TYPE('__SCSI__') = 'UNDEFINED' THEN
  18. __SCSI__ SET 1
  19.  
  20.  
  21.     IF &TYPE('__TYPES__') = 'UNDEFINED' THEN
  22.     include 'Types.a'
  23.     ENDIF
  24. ;        include 'ConditionalMacros.a'                                ;
  25.  
  26.     IF &TYPE('__MIXEDMODE__') = 'UNDEFINED' THEN
  27.     include 'MixedMode.a'
  28.     ENDIF
  29.  
  30. scInc                            EQU        1
  31. scNoInc                            EQU        2
  32. scAdd                            EQU        3
  33. scMove                            EQU        4
  34. scLoop                            EQU        5
  35. scNop                            EQU        6
  36. scStop                            EQU        7
  37. scComp                            EQU        8
  38.  
  39. ; SCSI Manager errors 
  40. scCommErr                        EQU        2                    ; communications error, operation timeout 
  41. scArbNBErr                        EQU        3                    ; arbitration timeout waiting for not BSY 
  42. scBadParmsErr                    EQU        4                    ; bad parameter or TIB opcode 
  43. scPhaseErr                        EQU        5                    ; SCSI bus not in correct phase for attempted operation 
  44. scCompareErr                    EQU        6                    ; data compare error 
  45. scMgrBusyErr                    EQU        7                    ; SCSI Manager busy  
  46. scSequenceErr                    EQU        8                    ; attempted operation is out of sequence 
  47. scBusTOErr                        EQU        9                    ; CPU bus timeout 
  48. scComplPhaseErr                    EQU        10                    ; SCSI bus wasn't in Status phase 
  49.  
  50. ; Signatures 
  51. sbSIGWord                        EQU        $4552                ; signature word for Block 0 ('ER') 
  52. sbMac                            EQU        1                    ; system type for Mac 
  53. pMapSIG                            EQU        $504D                ; partition map signature ('PM') 
  54. pdSigWord                        EQU        $5453
  55.  
  56. oldPMSigWord                    EQU        pdSigWord
  57. newPMSigWord                    EQU        pMapSIG
  58.  
  59. ; Driver Descriptor Map 
  60. Block0                     RECORD    0
  61. sbSig                     ds.w    1                                    ; unique value for SCSI block 0 
  62. sbBlkSize                 ds.w    1                                    ; block size of device 
  63. sbBlkCount                 ds.l    1                                    ; number of blocks on device 
  64. sbDevType                 ds.w    1                                    ; device type 
  65. sbDevId                     ds.w    1                                    ; device id 
  66. sbData                     ds.l    1                                    ; not used 
  67. sbDrvrCount                 ds.w    1                                    ; driver descriptor count 
  68. ddBlock                     ds.l    1                                    ; 1st driver's starting block 
  69. ddSize                     ds.w    1                                    ; size of 1st driver (512-byte blks) 
  70. ddType                     ds.w    1                                    ; system type (1 for Mac+) 
  71. ddPad                     ds.w    243                                ; ARRAY[0..242] OF INTEGER; not used 
  72. sizeof                     EQU    512
  73.                         ENDR
  74.  
  75. ; Partition Map Entry 
  76. Partition                 RECORD    0
  77. pmSig                     ds.w    1                                    ; unique value for map entry blk 
  78. pmSigPad                 ds.w    1                                    ; currently unused 
  79. pmMapBlkCnt                 ds.l    1                                    ; # of blks in partition map 
  80. pmPyPartStart             ds.l    1                                    ; physical start blk of partition 
  81. pmPartBlkCnt             ds.l    1                                    ; # of blks in this partition 
  82. pmPartName                 ds.b    32                                ; ASCII partition name 
  83. pmParType                 ds.b    32                                ; ASCII partition type 
  84. pmLgDataStart             ds.l    1                                    ; log. # of partition's 1st data blk 
  85. pmDataCnt                 ds.l    1                                    ; # of blks in partition's data area 
  86. pmPartStatus             ds.l    1                                    ; bit field for partition status 
  87. pmLgBootStart             ds.l    1                                    ; log. blk of partition's boot code 
  88. pmBootSize                 ds.l    1                                    ; number of bytes in boot code 
  89. pmBootAddr                 ds.l    1                                    ; memory load address of boot code 
  90. pmBootAddr2                 ds.l    1                                    ; currently unused 
  91. pmBootEntry                 ds.l    1                                    ; entry point of boot code 
  92. pmBootEntry2             ds.l    1                                    ; currently unused 
  93. pmBootCksum                 ds.l    1                                    ; checksum of boot code 
  94. pmProcessor                 ds.b    16                                ; ASCII for the processor type 
  95. pmPad                     ds.w    188                                ; 512 bytes long currently unused 
  96. sizeof                     EQU    512
  97.                         ENDR
  98.  
  99. ; TIB instruction 
  100. SCSIInstr                 RECORD    0
  101. scOpcode                 ds.w    1
  102. scParam1                 ds.l    1
  103. scParam2                 ds.l    1
  104. sizeof                     EQU    10
  105.                         ENDR
  106.  
  107.     IF GENERATING68K THEN
  108.         Macro
  109.         _SCSIReset
  110.             dc.w     $4267
  111.             dc.w     $A815
  112.         EndM
  113.     ELSE
  114.         IMPORT    SCSIReset
  115.     ENDIF
  116.  
  117.     IF GENERATING68K THEN
  118.         Macro
  119.         _SCSIGet
  120.             move.w    #$0001,-(sp)
  121.             dc.w     $A815
  122.         EndM
  123.     ELSE
  124.         IMPORT    SCSIGet
  125.     ENDIF
  126.  
  127.     IF GENERATING68K THEN
  128.         Macro
  129.         _SCSISelect
  130.             move.w    #$0002,-(sp)
  131.             dc.w     $A815
  132.         EndM
  133.     ELSE
  134.         IMPORT    SCSISelect
  135.     ENDIF
  136.  
  137.     IF GENERATING68K THEN
  138.         Macro
  139.         _SCSICmd
  140.             move.w    #$0003,-(sp)
  141.             dc.w     $A815
  142.         EndM
  143.     ELSE
  144.         IMPORT    SCSICmd
  145.     ENDIF
  146.  
  147.     IF GENERATING68K THEN
  148.         Macro
  149.         _SCSIRead
  150.             move.w    #$0005,-(sp)
  151.             dc.w     $A815
  152.         EndM
  153.     ELSE
  154.         IMPORT    SCSIRead
  155.     ENDIF
  156.  
  157.     IF GENERATING68K THEN
  158.         Macro
  159.         _SCSIRBlind
  160.             move.w    #$0008,-(sp)
  161.             dc.w     $A815
  162.         EndM
  163.     ELSE
  164.         IMPORT    SCSIRBlind
  165.     ENDIF
  166.  
  167.     IF GENERATING68K THEN
  168.         Macro
  169.         _SCSIWrite
  170.             move.w    #$0006,-(sp)
  171.             dc.w     $A815
  172.         EndM
  173.     ELSE
  174.         IMPORT    SCSIWrite
  175.     ENDIF
  176.  
  177.     IF GENERATING68K THEN
  178.         Macro
  179.         _SCSIWBlind
  180.             move.w    #$0009,-(sp)
  181.             dc.w     $A815
  182.         EndM
  183.     ELSE
  184.         IMPORT    SCSIWBlind
  185.     ENDIF
  186.  
  187.     IF GENERATING68K THEN
  188.         Macro
  189.         _SCSIComplete
  190.             move.w    #$0004,-(sp)
  191.             dc.w     $A815
  192.         EndM
  193.     ELSE
  194.         IMPORT    SCSIComplete
  195.     ENDIF
  196.  
  197.     IF GENERATING68K THEN
  198.         Macro
  199.         _SCSIStat
  200.             move.w    #$000A,-(sp)
  201.             dc.w     $A815
  202.         EndM
  203.     ELSE
  204.         IMPORT    SCSIStat
  205.     ENDIF
  206.  
  207.     IF GENERATING68K THEN
  208.         Macro
  209.         _SCSISelAtn
  210.             move.w    #$000B,-(sp)
  211.             dc.w     $A815
  212.         EndM
  213.     ELSE
  214.         IMPORT    SCSISelAtn
  215.     ENDIF
  216.  
  217.     IF GENERATING68K THEN
  218.         Macro
  219.         _SCSIMsgIn
  220.             move.w    #$000C,-(sp)
  221.             dc.w     $A815
  222.         EndM
  223.     ELSE
  224.         IMPORT    SCSIMsgIn
  225.     ENDIF
  226.  
  227.     IF GENERATING68K THEN
  228.         Macro
  229.         _SCSIMsgOut
  230.             move.w    #$000D,-(sp)
  231.             dc.w     $A815
  232.         EndM
  233.     ELSE
  234.         IMPORT    SCSIMsgOut
  235.     ENDIF
  236.  
  237. ;——————————————————————— New SCSI Manager Interface ———————————————————————
  238.  
  239. scsiVERSION                        EQU        43
  240.  
  241. ; SCSI Manager function codes 
  242. SCSINop                            EQU        $00                    ; Execute nothing                                         
  243. SCSIExecIO                        EQU        $01                    ; Execute the specified IO                             
  244. SCSIBusInquiry                    EQU        $03                    ; Get parameters for entire path of HBAs                 
  245. SCSIReleaseQ                    EQU        $04                    ; Release the frozen SIM queue for particular LUN         
  246. SCSIAbortCommand                EQU        $10                    ; Abort the selected Control Block                      
  247. SCSIResetBus                    EQU        $11                    ; Reset the SCSI bus                                      
  248. SCSIResetDevice                    EQU        $12                    ; Reset the SCSI device                                  
  249. SCSITerminateIO                    EQU        $13                    ; Terminate any pending IO                              
  250. SCSIGetVirtualIDInfo            EQU        $80                    ; Find out which bus old ID is on                         
  251. SCSILoadDriver                    EQU        $82                    ; Load a driver for a device ident                     
  252. SCSIOldCall                        EQU        $84                    ; XPT->SIM private call for old-API                     
  253. SCSICreateRefNumXref            EQU        $85                    ; Register a DeviceIdent to drvr RefNum xref             
  254. SCSILookupRefNumXref            EQU        $86                    ; Get DeviceIdent to drvr RefNum xref                     
  255. SCSIRemoveRefNumXref            EQU        $87                    ; Remove a DeviceIdent to drvr RefNum xref             
  256. SCSIRegisterWithNewXPT            EQU        $88                    ; XPT has changed - SIM needs to re-register itself     
  257. vendorUnique                    EQU        $C0                    ; 0xC0 thru 0xFF 
  258.  
  259. ; SCSI Callback Procedure Prototypes 
  260. handshakeDataLength                EQU        8                    ; Handshake data length 
  261. maxCDBLength                    EQU        16                    ; Space for the CDB bytes/pointer 
  262. vendorIDLength                    EQU        16                    ; ASCII string len for Vendor ID  
  263.  
  264. ; Define DeviceIdent structure 
  265. DeviceIdent             RECORD    0
  266. diReserved                 ds.b    1                                    ; reserved                 
  267. bus                         ds.b    1                                    ; SCSI - Bus Number        
  268. targetID                 ds.b    1                                    ; SCSI - Target SCSI ID    
  269. LUN                         ds.b    1                                    ; SCSI - LUN                  
  270. sizeof                     EQU    4
  271.                         ENDR
  272.  
  273. ; Command Descriptor Block structure 
  274. SGRecord                 RECORD    0
  275. SGAddr                     ds.l    1
  276. SGCount                     ds.l    1
  277. sizeof                     EQU    8
  278.                         ENDR
  279.  
  280. ; SCSI Phases (used by SIMs to support the Original SCSI Manager 
  281.  
  282. kDataOutPhase                    EQU        0                    ; Encoded MSG, C/D, I/O bits 
  283. kDataInPhase                    EQU        1
  284. kCommandPhase                    EQU        2
  285. kStatusPhase                    EQU        3
  286. kPhaseIllegal0                    EQU        4
  287. kPhaseIllegal1                    EQU        5
  288. kMessageOutPhase                EQU        6
  289. kMessageInPhase                    EQU        7
  290. kBusFreePhase                    EQU        8                    ; Additional Phases 
  291. kArbitratePhase                    EQU        9
  292. kSelectPhase                    EQU        10
  293. kMessageInPhaseNACK                EQU        11                    ; Message In Phase with ACK hanging on the bus 
  294.  
  295. SCSIHdr                 RECORD    0
  296. qLink                     ds.l    1
  297. scsiReserved1             ds.w    1
  298. scsiPBLength             ds.w    1
  299. scsiFunctionCode         ds.b    1
  300. scsiReserved2             ds.b    1
  301. scsiResult                 ds.w    1
  302. scsiDevice                 ds        DeviceIdent
  303. scsiCompletion             ds.l    1
  304. scsiFlags                 ds.l    1
  305. scsiDriverStorage         ds.l    1
  306. scsiXPTprivate             ds.l    1
  307. scsiReserved3             ds.l    1
  308. sizeof                     EQU    36
  309.                         ENDR
  310.  
  311. SCSI_PB                 RECORD    0
  312. qLink                     ds.l    1
  313. scsiReserved1             ds.w    1
  314. scsiPBLength             ds.w    1
  315. scsiFunctionCode         ds.b    1
  316. scsiReserved2             ds.b    1
  317. scsiResult                 ds.w    1
  318. scsiDevice                 ds        DeviceIdent
  319. scsiCompletion             ds.l    1
  320. scsiFlags                 ds.l    1
  321. scsiDriverStorage         ds.l    1
  322. scsiXPTprivate             ds.l    1
  323. scsiReserved3             ds.l    1
  324. sizeof                     EQU    36
  325.                         ENDR
  326.  
  327. SCSI_IO                 RECORD    0
  328. qLink                     ds.l    1
  329. scsiReserved1             ds.w    1
  330. scsiPBLength             ds.w    1
  331. scsiFunctionCode         ds.b    1
  332. scsiReserved2             ds.b    1
  333. scsiResult                 ds.w    1
  334. scsiDevice                 ds        DeviceIdent
  335. scsiCompletion             ds.l    1
  336. scsiFlags                 ds.l    1
  337. scsiDriverStorage         ds.l    1
  338. scsiXPTprivate             ds.l    1
  339. scsiReserved3             ds.l    1
  340. scsiResultFlags             ds.w    1
  341. scsiReserved3pt5         ds.w    1
  342. scsiDataPtr                 ds.l    1
  343. scsiDataLength             ds.l    1
  344. scsiSensePtr             ds.l    1
  345. scsiSenseLength             ds.b    1
  346. scsiCDBLength             ds.b    1
  347. scsiSGListCount             ds.w    1
  348. scsiReserved4             ds.l    1
  349. scsiSCSIstatus             ds.b    1
  350. scsiSenseResidual         ds.b    1
  351. scsiReserved5             ds.w    1
  352. scsiDataResidual         ds.l    1
  353. scsiCDB                     ds.w    3
  354. scsiTimeout                 ds.l    1
  355. scsiReserved5pt5         ds.l    1
  356. scsiReserved5pt6         ds.w    1
  357. scsiIOFlags                 ds.w    1
  358. scsiTagAction             ds.b    1
  359. scsiReserved6             ds.b    1
  360. scsiReserved7             ds.w    1
  361. scsiSelectTimeout         ds.w    1
  362. scsiDataType             ds.b    1
  363. scsiTransferType         ds.b    1
  364. scsiReserved8             ds.l    1
  365. scsiReserved9             ds.l    1
  366. scsiHandshake             ds.w    1
  367. scsiReserved10             ds.l    1
  368. scsiReserved11             ds.l    1
  369. scsiCommandLink             ds.l    1
  370. scsiSIMpublics             ds.b    8
  371. scsiAppleReserved6         ds.b    8
  372. scsiCurrentPhase         ds.w    1
  373. scsiSelector             ds.w    1
  374. scsiOldCallResult         ds.w    1
  375. scsiSCSImessage             ds.b    1
  376. XPTprivateFlags             ds.b    1
  377. XPTextras                 ds.b    12
  378. sizeof                     EQU    152
  379.                         ENDR
  380.  
  381. ; Bus inquiry PB 
  382. SCSIBusInquiryPB         RECORD    0
  383. qLink                     ds.l    1
  384. scsiReserved1             ds.w    1
  385. scsiPBLength             ds.w    1
  386. scsiFunctionCode         ds.b    1
  387. scsiReserved2             ds.b    1
  388. scsiResult                 ds.w    1
  389. scsiDevice                 ds        DeviceIdent
  390. scsiCompletion             ds.l    1
  391. scsiFlags                 ds.l    1
  392. scsiDriverStorage         ds.l    1
  393. scsiXPTprivate             ds.l    1
  394. scsiReserved3             ds.l    1
  395. scsiEngineCount             ds.w    1                                    ; <- Number of engines on HBA                         
  396. scsiMaxTransferType         ds.w    1                                    ; <- Number of transfer types for this HBA            
  397. scsiDataTypes             ds.l    1                                    ; <- which data types are supported by this SIM     
  398. scsiIOpbSize             ds.w    1                                    ; <- Size of SCSI_IO PB for this SIM/HBA             
  399. scsiMaxIOpbSize             ds.w    1                                    ; <- Size of max SCSI_IO PB for all SIM/HBAs         
  400. scsiFeatureFlags         ds.l    1                                    ; <- Supported features flags field                 
  401. scsiVersionNumber         ds.b    1                                    ; <- Version number for the SIM/HBA                 
  402. scsiHBAInquiry             ds.b    1                                    ; <- Mimic of INQ byte 7 for the HBA                 
  403. scsiTargetModeFlags         ds.b    1                                    ; <- Flags for target mode support                 
  404. scsiScanFlags             ds.b    1                                    ; <- Scan related feature flags                     
  405. scsiSIMPrivatesPtr         ds.l    1                                    ; <- Ptr to SIM private data area                     
  406. scsiSIMPrivatesSize         ds.l    1                                    ; <- Size of SIM private data area                 
  407. scsiAsyncFlags             ds.l    1                                    ; <- Event cap. for Async Callback                 
  408. scsiHiBusID                 ds.b    1                                    ; <- Highest path ID in the subsystem              
  409. scsiInitiatorID             ds.b    1                                    ; <- ID of the HBA on the SCSI bus                 
  410. scsiBIReserved0             ds.w    1                                    ;                                                    
  411. scsiBIReserved1             ds.l    1                                    ; <-                                                  
  412. scsiFlagsSupported         ds.l    1                                    ; <- which scsiFlags are supported                 
  413. scsiIOFlagsSupported     ds.w    1                                    ; <- which scsiIOFlags are supported                 
  414. scsiWeirdStuff             ds.w    1                                    ; <-                                                 
  415. scsiMaxTarget             ds.w    1                                    ; <- maximum Target number supported                 
  416. scsiMaxLUN                 ds.w    1                                    ; <- maximum Logical Unit number supported         
  417. scsiSIMVendor             ds.b    1                                    ; <- Vendor ID of SIM (or XPT if bus<FF)         
  418. scsiHBAVendor             ds.b    1                                    ; <- Vendor ID of the HBA                         
  419. scsiControllerFamily     ds.b    1                                    ; <- Family of SCSI Controller                 
  420. scsiControllerType         ds.b    1                                    ; <- Specific Model of SCSI Controller used     
  421. scsiXPTversion             ds.b    4                                    ; <- version number of XPT                         
  422. scsiSIMversion             ds.b    4                                    ; <- version number of SIM                         
  423. scsiHBAversion             ds.b    4                                    ; <- version number of HBA                         
  424. scsiHBAslotType             ds.b    1                                    ; <- type of "slot" that this HBA is in            
  425. scsiHBAslotNumber         ds.b    1                                    ; <- slot number of this HBA                         
  426. scsiSIMsRsrcID             ds.w    1                                    ; <- resource ID of this SIM                         
  427. scsiBIReserved3             ds.w    1                                    ; <-                                                 
  428. scsiAdditionalLength     ds.w    1                                    ; <- additional BusInquiry PB len                    
  429. sizeof                     EQU    112
  430.                         ENDR
  431.  
  432. ; Abort SIM Request PB 
  433. SCSIAbortCommandPB         RECORD    0
  434. qLink                     ds.l    1
  435. scsiReserved1             ds.w    1
  436. scsiPBLength             ds.w    1
  437. scsiFunctionCode         ds.b    1
  438. scsiReserved2             ds.b    1
  439. scsiResult                 ds.w    1
  440. scsiDevice                 ds        DeviceIdent
  441. scsiCompletion             ds.l    1
  442. scsiFlags                 ds.l    1
  443. scsiDriverStorage         ds.l    1
  444. scsiXPTprivate             ds.l    1
  445. scsiReserved3             ds.l    1
  446. scsiIOptr                 ds.l    1                                    ; Pointer to the PB to abort                        
  447. sizeof                     EQU    40
  448.                         ENDR
  449.  
  450. ; Terminate I/O Process Request PB 
  451. SCSITerminateIOPB         RECORD    0
  452. qLink                     ds.l    1
  453. scsiReserved1             ds.w    1
  454. scsiPBLength             ds.w    1
  455. scsiFunctionCode         ds.b    1
  456. scsiReserved2             ds.b    1
  457. scsiResult                 ds.w    1
  458. scsiDevice                 ds        DeviceIdent
  459. scsiCompletion             ds.l    1
  460. scsiFlags                 ds.l    1
  461. scsiDriverStorage         ds.l    1
  462. scsiXPTprivate             ds.l    1
  463. scsiReserved3             ds.l    1
  464. scsiIOptr                 ds.l    1                                    ; Pointer to the PB to terminate                     
  465. sizeof                     EQU    40
  466.                         ENDR
  467.  
  468. ; Reset SCSI Bus PB 
  469. SCSIResetBusPB             RECORD    0
  470. qLink                     ds.l    1
  471. scsiReserved1             ds.w    1
  472. scsiPBLength             ds.w    1
  473. scsiFunctionCode         ds.b    1
  474. scsiReserved2             ds.b    1
  475. scsiResult                 ds.w    1
  476. scsiDevice                 ds        DeviceIdent
  477. scsiCompletion             ds.l    1
  478. scsiFlags                 ds.l    1
  479. scsiDriverStorage         ds.l    1
  480. scsiXPTprivate             ds.l    1
  481. scsiReserved3             ds.l    1
  482. sizeof                     EQU    36
  483.                         ENDR
  484.  
  485. ; Reset SCSI Device PB 
  486. SCSIResetDevicePB         RECORD    0
  487. qLink                     ds.l    1
  488. scsiReserved1             ds.w    1
  489. scsiPBLength             ds.w    1
  490. scsiFunctionCode         ds.b    1
  491. scsiReserved2             ds.b    1
  492. scsiResult                 ds.w    1
  493. scsiDevice                 ds        DeviceIdent
  494. scsiCompletion             ds.l    1
  495. scsiFlags                 ds.l    1
  496. scsiDriverStorage         ds.l    1
  497. scsiXPTprivate             ds.l    1
  498. scsiReserved3             ds.l    1
  499. sizeof                     EQU    36
  500.                         ENDR
  501.  
  502. ; Release SIM Queue PB 
  503. SCSIReleaseQPB             RECORD    0
  504. qLink                     ds.l    1
  505. scsiReserved1             ds.w    1
  506. scsiPBLength             ds.w    1
  507. scsiFunctionCode         ds.b    1
  508. scsiReserved2             ds.b    1
  509. scsiResult                 ds.w    1
  510. scsiDevice                 ds        DeviceIdent
  511. scsiCompletion             ds.l    1
  512. scsiFlags                 ds.l    1
  513. scsiDriverStorage         ds.l    1
  514. scsiXPTprivate             ds.l    1
  515. scsiReserved3             ds.l    1
  516. sizeof                     EQU    36
  517.                         ENDR
  518.  
  519. ; SCSI Get Virtual ID Info PB 
  520. SCSIGetVirtualIDInfoPB     RECORD    0
  521. qLink                     ds.l    1
  522. scsiReserved1             ds.w    1
  523. scsiPBLength             ds.w    1
  524. scsiFunctionCode         ds.b    1
  525. scsiReserved2             ds.b    1
  526. scsiResult                 ds.w    1
  527. scsiDevice                 ds        DeviceIdent
  528. scsiCompletion             ds.l    1
  529. scsiFlags                 ds.l    1
  530. scsiDriverStorage         ds.l    1
  531. scsiXPTprivate             ds.l    1
  532. scsiReserved3             ds.l    1
  533. scsiOldCallID             ds.w    1                                    ; -> SCSI ID of device in question             
  534. scsiExists                 ds.b    1                                    ; <- true if device exists                     
  535. filler                     ds.b    1
  536. sizeof                     EQU    40
  537.                         ENDR
  538.  
  539. ; Create/Lookup/Remove RefNum for Device PB 
  540. SCSIDriverPB             RECORD    0
  541. qLink                     ds.l    1
  542. scsiReserved1             ds.w    1
  543. scsiPBLength             ds.w    1
  544. scsiFunctionCode         ds.b    1
  545. scsiReserved2             ds.b    1
  546. scsiResult                 ds.w    1
  547. scsiDevice                 ds        DeviceIdent
  548. scsiCompletion             ds.l    1
  549. scsiFlags                 ds.l    1
  550. scsiDriverStorage         ds.l    1
  551. scsiXPTprivate             ds.l    1
  552. scsiReserved3             ds.l    1
  553. scsiDriver                 ds.w    1                                    ; -> DriverRefNum, For SetDriver, <- For GetNextDriver 
  554. scsiDriverFlags             ds.w    1                                    ; <> Details of driver/device                     
  555. scsiNextDevice             ds        DeviceIdent                        ; <- DeviceIdent of the NEXT Item in the list  
  556. sizeof                     EQU    44
  557.                         ENDR
  558.  
  559. ; Load Driver PB 
  560. SCSILoadDriverPB         RECORD    0
  561. qLink                     ds.l    1
  562. scsiReserved1             ds.w    1
  563. scsiPBLength             ds.w    1
  564. scsiFunctionCode         ds.b    1
  565. scsiReserved2             ds.b    1
  566. scsiResult                 ds.w    1
  567. scsiDevice                 ds        DeviceIdent
  568. scsiCompletion             ds.l    1
  569. scsiFlags                 ds.l    1
  570. scsiDriverStorage         ds.l    1
  571. scsiXPTprivate             ds.l    1
  572. scsiReserved3             ds.l    1
  573. scsiLoadedRefNum         ds.w    1                                    ; <- SIM returns refnum of driver                     
  574. scsiDiskLoadFailed         ds.b    1                                    ; -> if true, indicates call after failure to load 
  575. filler                     ds.b    1
  576. sizeof                     EQU    40
  577.                         ENDR
  578.  
  579. ; Defines for the scsiTransferType field 
  580.  
  581. scsiTransferBlind                EQU        0
  582. scsiTransferPolled                EQU        1
  583.  
  584. ; Defines for the scsiDataType field 
  585. scsiDataBuffer                    EQU        0                    ; single contiguous buffer supplied                  
  586. scsiDataTIB                        EQU        1                    ; TIB supplied (ptr in scsiDataPtr)                 
  587. scsiDataSG                        EQU        2                    ; scatter/gather list supplied                      
  588.  
  589. ; Defines for the SCSIMgr scsiResult field in the PB header. 
  590. ;  $E100 thru  E1FF 
  591. ; -$1EFF thru -1E00 
  592. ; -#7935 thru -7681  
  593. ; = 0xE100 
  594. scsiErrorBase                    EQU        -7936
  595.  
  596. scsiRequestInProgress            EQU        1                    ; 1     = PB request is in progress             
  597. ; Execution failed  00-2F 
  598. scsiRequestAborted                EQU        scsiErrorBase + 2    ; -7934 = PB request aborted by the host         
  599. scsiUnableToAbort                EQU        scsiErrorBase + 3    ; -7933 = Unable to Abort PB request             
  600. scsiNonZeroStatus                EQU        scsiErrorBase + 4    ; -7932 = PB request completed with an err     
  601. scsiUnused05                    EQU        scsiErrorBase + 5    ; -7931 =                                      
  602. scsiUnused06                    EQU        scsiErrorBase + 6    ; -7930 =                                      
  603. scsiUnused07                    EQU        scsiErrorBase + 7    ; -7929 =                                      
  604. scsiUnused08                    EQU        scsiErrorBase + 8    ; -7928 =                                      
  605. scsiUnableToTerminate            EQU        scsiErrorBase + 9    ; -7927 = Unable to Terminate I/O PB req         
  606. scsiSelectTimeout                EQU        scsiErrorBase + 10    ; -7926 = Target selection timeout             
  607. scsiCommandTimeout                EQU        scsiErrorBase + 11    ; -7925 = Command timeout                      
  608. scsiIdentifyMessageRejected        EQU        scsiErrorBase + 12    ; -7924 =                                      
  609. scsiMessageRejectReceived        EQU        scsiErrorBase + 13    ; -7923 = Message reject received                 
  610. scsiSCSIBusReset                EQU        scsiErrorBase + 14    ; -7922 = SCSI bus reset sent/received         
  611. scsiParityError                    EQU        scsiErrorBase + 15    ; -7921 = Uncorrectable parity error occured     
  612. scsiAutosenseFailed                EQU        scsiErrorBase + 16    ; -7920 = Autosense: Request sense cmd fail     
  613. scsiUnused11                    EQU        scsiErrorBase + 17    ; -7919 =                                      
  614. scsiDataRunError                EQU        scsiErrorBase + 18    ; -7918 = Data overrun/underrun error          
  615. scsiUnexpectedBusFree            EQU        scsiErrorBase + 19    ; -7917 = Unexpected BUS free                     
  616. scsiSequenceFailed                EQU        scsiErrorBase + 20    ; -7916 = Target bus phase sequence failure     
  617. scsiWrongDirection                EQU        scsiErrorBase + 21    ; -7915 = Data phase was in wrong direction     
  618. scsiUnused16                    EQU        scsiErrorBase + 22    ; -7914 =                                      
  619. scsiBDRsent                        EQU        scsiErrorBase + 23    ; -7913 = A SCSI BDR msg was sent to target     
  620. scsiTerminated                    EQU        scsiErrorBase + 24    ; -7912 = PB request terminated by the host     
  621. scsiNoNexus                        EQU        scsiErrorBase + 25    ; -7911 = Nexus is not established             
  622. scsiCDBReceived                    EQU        scsiErrorBase + 26    ; -7910 = The SCSI CDB has been received         
  623. ; Couldn't begin execution  30-3F 
  624. scsiTooManyBuses                EQU        scsiErrorBase + 48    ; -7888 = Register failed because we're full    
  625. scsiBusy                        EQU        scsiErrorBase + 49    ; -7887 = SCSI subsystem is busy                 
  626. scsiProvideFail                    EQU        scsiErrorBase + 50    ; -7886 = Unable to provide requ. capability    
  627. scsiDeviceNotThere                EQU        scsiErrorBase + 51    ; -7885 = SCSI device not installed/there      
  628. scsiNoHBA                        EQU        scsiErrorBase + 52    ; -7884 = No HBA detected Error                 
  629. scsiDeviceConflict                EQU        scsiErrorBase + 53    ; -7883 = sorry, max 1 refNum per DeviceIdent     
  630. scsiNoSuchXref                    EQU        scsiErrorBase + 54    ; -7882 = no such RefNum xref                     
  631. scsiQLinkInvalid                EQU        scsiErrorBase + 55    ; -7881 = pre-linked PBs not supported            
  632. ;                                                                   (The QLink field was nonzero)        
  633. ; Parameter errors  40-7F 
  634. scsiPBLengthError                EQU        scsiErrorBase + 64    ; -7872 = (scsiPBLength is insuf'ct/invalid     
  635. scsiFunctionNotAvailable        EQU        scsiErrorBase + 65    ; -7871 = The requ. func is not available      
  636. scsiRequestInvalid                EQU        scsiErrorBase + 66    ; -7870 = PB request is invalid                 
  637. scsiBusInvalid                    EQU        scsiErrorBase + 67    ; -7869 = Bus ID supplied is invalid              
  638. scsiTIDInvalid                    EQU        scsiErrorBase + 68    ; -7868 = Target ID supplied is invalid         
  639. scsiLUNInvalid                    EQU        scsiErrorBase + 69    ; -7867 = LUN supplied is invalid              
  640. scsiIDInvalid                    EQU        scsiErrorBase + 70    ; -7866 = The initiator ID is invalid          
  641. scsiDataTypeInvalid                EQU        scsiErrorBase + 71    ; -7865 = scsiDataType requested not supported 
  642. scsiTransferTypeInvalid            EQU        scsiErrorBase + 72    ; -7864 = scsiTransferType field is too high     
  643. scsiCDBLengthInvalid            EQU        scsiErrorBase + 73    ; -7863 = scsiCDBLength field is too big         
  644.  
  645. scsiExecutionErrors                EQU        scsiErrorBase
  646. scsiNotExecutedErrors            EQU        scsiTooManyBuses
  647. scsiParameterErrors                EQU        scsiPBLengthError
  648.  
  649. ; Defines for the scsiResultFlags field 
  650. scsiSIMQFrozen                    EQU        $0001                ; The SIM queue is frozen w/this err            
  651. scsiAutosenseValid                EQU        $0002                ; Autosense data valid for target              
  652. scsiBusNotFree                    EQU        $0004                ; At time of callback, SCSI bus is not free    
  653.  
  654. ; Defines for the bit numbers of the scsiFlags field in the PB header for the SCSIExecIO function 
  655. kbSCSIDisableAutosense            EQU        29                    ; Disable auto sense feature                     
  656. kbSCSIFlagReservedA                EQU        28                    ;                                              
  657. kbSCSIFlagReserved0                EQU        27                    ;                                              
  658. kbSCSICDBLinked                    EQU        26                    ; The PB contains a linked CDB                    
  659. kbSCSIQEnable                    EQU        25                    ; Target queue actions are enabled                
  660. kbSCSICDBIsPointer                EQU        24                    ; The CDB field contains a pointer                
  661. kbSCSIFlagReserved1                EQU        23                    ;                                                 
  662. kbSCSIInitiateSyncData            EQU        22                    ; Attempt Sync data xfer and SDTR                
  663. kbSCSIDisableSyncData            EQU        21                    ; Disable sync, go to async                    
  664. kbSCSISIMQHead                    EQU        20                    ; Place PB at the head of SIM Q                
  665. kbSCSISIMQFreeze                EQU        19                    ; Return the SIM Q to frozen state                
  666. kbSCSISIMQNoFreeze                EQU        18                    ; Disallow SIM Q freezing                        
  667. kbSCSIDoDisconnect                EQU        17                    ; Definitely do disconnect                        
  668. kbSCSIDontDisconnect            EQU        16                    ; Definitely don't disconnect                    
  669. kbSCSIDataReadyForDMA            EQU        15                    ; Data buffer(s) are ready for DMA                
  670. kbSCSIFlagReserved3                EQU        14                    ;                                                 
  671. kbSCSIDataPhysical                EQU        13                    ; SG/Buffer data ptrs are physical                
  672. kbSCSISensePhysical                EQU        12                    ; Autosense buffer ptr is physical                
  673. kbSCSIFlagReserved5                EQU        11                    ;                                                 
  674. kbSCSIFlagReserved6                EQU        10                    ;                                                 
  675. kbSCSIFlagReserved7                EQU        9                    ;                                                 
  676. kbSCSIFlagReserved8                EQU        8                    ;                                                 
  677. kbSCSIDataBufferValid            EQU        7                    ; Data buffer valid                            
  678. kbSCSIStatusBufferValid            EQU        6                    ; Status buffer valid                             
  679. kbSCSIMessageBufferValid        EQU        5                    ; Message buffer valid                            
  680. kbSCSIFlagReserved9                EQU        4                    ;                                              
  681.  
  682. ; Defines for the bit masks of the scsiFlags field 
  683. scsiDirectionMask                EQU        $C0000000            ; Data direction mask                        
  684. scsiDirectionNone                EQU        $C0000000            ; Data direction (11: no data)                
  685. scsiDirectionReserved            EQU        $00000000            ; Data direction (00: reserved)            
  686. scsiDirectionOut                EQU        $80000000            ; Data direction (10: DATA OUT)            
  687. scsiDirectionIn                    EQU        $40000000            ; Data direction (01: DATA IN)                
  688. scsiDisableAutosense            EQU        $20000000            ; Disable auto sense feature                
  689. scsiFlagReservedA                EQU        $10000000            ;                                             
  690. scsiFlagReserved0                EQU        $08000000            ;                                             
  691. scsiCDBLinked                    EQU        $04000000            ; The PB contains a linked CDB                
  692. scsiQEnable                        EQU        $02000000            ; Target queue actions are enabled            
  693. scsiCDBIsPointer                EQU        $01000000            ; The CDB field contains a pointer            
  694. scsiFlagReserved1                EQU        $00800000            ;                                             
  695. scsiInitiateSyncData            EQU        $00400000            ; Attempt Sync data xfer and SDTR            
  696. scsiDisableSyncData                EQU        $00200000            ; Disable sync, go to async                
  697. scsiSIMQHead                    EQU        $00100000            ; Place PB at the head of SIM Q            
  698. scsiSIMQFreeze                    EQU        $00080000            ; Return the SIM Q to frozen state            
  699. scsiSIMQNoFreeze                EQU        $00040000            ; Disallow SIM Q freezing                    
  700. scsiDoDisconnect                EQU        $00020000            ; Definitely do disconnect                    
  701. scsiDontDisconnect                EQU        $00010000            ; Definitely don't disconnect                
  702. scsiDataReadyForDMA                EQU        $00008000            ; Data buffer(s) are ready for DMA            
  703. scsiFlagReserved3                EQU        $00004000            ;  
  704. scsiDataPhysical                EQU        $00002000            ; SG/Buffer data ptrs are physical            
  705. scsiSensePhysical                EQU        $00001000            ; Autosense buffer ptr is physical            
  706. scsiFlagReserved5                EQU        $00000800            ;                                          
  707. scsiFlagReserved6                EQU        $00000400            ;                                             
  708. scsiFlagReserved7                EQU        $00000200            ;                                             
  709. scsiFlagReserved8                EQU        $00000100            ;                                             
  710.  
  711. ; bit masks for the scsiIOFlags field in SCSIExecIOPB 
  712. scsiNoParityCheck                EQU        $0002                ; disable parity checking                             
  713. scsiDisableSelectWAtn            EQU        $0004                ; disable select w/Atn                              
  714. scsiSavePtrOnDisconnect            EQU        $0008                ; do SaveDataPointer upon Disconnect msg             
  715. scsiNoBucketIn                    EQU        $0010                ; don’t bit bucket in during this I/O                 
  716. scsiNoBucketOut                    EQU        $0020                ; don’t bit bucket out during this I/O             
  717. scsiDisableWide                    EQU        $0040                ; disable wide transfer negotiation                 
  718. scsiInitiateWide                EQU        $0080                ; initiate wide transfer negotiation                 
  719. scsiRenegotiateSense            EQU        $0100                ; renegotiate sync/wide before issuing autosense     
  720. scsiDisableDiscipline            EQU        $0200                ; disable parameter checking on SCSIExecIO calls    
  721. scsiIOFlagReserved0080            EQU        $0080                ;                                                  
  722. scsiIOFlagReserved8000            EQU        $8000                ;                                                     
  723.  
  724. ; Defines for the SIM/HBA queue actions.  These values are used in the 
  725. ; SCSIExecIOPB, for the queue action field. [These values should match the 
  726. ; defines from some other include file for the SCSI message phases.  We may 
  727. ; not need these definitions here. ] 
  728. scsiSimpleQTag                    EQU        $20                    ; Tag for a simple queue                                 
  729. scsiHeadQTag                    EQU        $21                    ; Tag for head of queue                                  
  730. scsiOrderedQTag                    EQU        $22                    ; Tag for ordered queue                                 
  731.  
  732. ; Defines for the Bus Inquiry PB fields. 
  733. ; scsiHBAInquiry field bits 
  734. scsiBusMDP                        EQU        $80                    ; Supports Modify Data Pointer message                        
  735. scsiBusWide32                    EQU        $40                    ; Supports 32 bit wide SCSI                                
  736. scsiBusWide16                    EQU        $20                    ; Supports 16 bit wide SCSI                                
  737. scsiBusSDTR                        EQU        $10                    ; Supports Sync Data Transfer Req message                    
  738. scsiBusLinkedCDB                EQU        $08                    ; Supports linked CDBs                                        
  739. scsiBusTagQ                        EQU        $02                    ; Supports tag queue message                                
  740. scsiBusSoftReset                EQU        $01                    ; Supports soft reset                                        
  741.  
  742. ; scsiDataTypes field bits  
  743. ;    bits 0->15 Apple-defined, 16->30 3rd-party unique, 31 = reserved 
  744. scsiBusDataTIB                    EQU        (1 << scsiDataTIB)    ; TIB supplied (ptr in scsiDataPtr)        
  745. scsiBusDataBuffer                EQU        (1 << scsiDataBuffer) ; single contiguous buffer supplied         
  746. scsiBusDataSG                    EQU        (1 << scsiDataSG)    ; scatter/gather list supplied             
  747. scsiBusDataReserved                EQU        $80000000            ;                                           
  748.  
  749. ; scsiScanFlags field bits 
  750. scsiBusScansDevices                EQU        $80                    ; Bus scans for and maintains device list            
  751. scsiBusScansOnInit                EQU        $40                    ; Bus scans performed at power-up/reboot            
  752. scsiBusLoadsROMDrivers            EQU        $20                    ; may load ROM drivers to support targets             
  753.  
  754. ; scsiFeatureFlags field bits 
  755. scsiBusInternalExternalMask        EQU        $000000C0            ; bus internal/external mask                    
  756. scsiBusInternalExternalUnknown    EQU        $00000000            ; not known whether bus is inside or outside     
  757. scsiBusInternalExternal            EQU        $000000C0            ; bus goes inside and outside the box             
  758. scsiBusInternal                    EQU        $00000080            ; bus goes inside the box                         
  759. scsiBusExternal                    EQU        $00000040            ; bus goes outside the box                     
  760. scsiBusCacheCoherentDMA            EQU        $00000020            ; DMA is cache coherent                         
  761. scsiBusOldCallCapable            EQU        $00000010            ; SIM is old call capable                         
  762. scsiBusDifferential                EQU        $00000004            ; Single Ended (0) or Differential (1)         
  763. scsiBusFastSCSI                    EQU        $00000002            ; HBA supports fast SCSI                         
  764. scsiBusDMAavailable                EQU        $00000001            ; DMA is available                             
  765.  
  766. ; scsiWeirdStuff field bits 
  767. scsiOddDisconnectUnsafeRead1    EQU        $0001                ; Disconnects on odd byte boundries are unsafe with DMA and/or blind reads 
  768. scsiOddDisconnectUnsafeWrite1    EQU        $0002                ; Disconnects on odd byte boundries are unsafe with DMA and/or blind writes 
  769. scsiBusErrorsUnsafe                EQU        $0004                ; Non-handshaked delays or disconnects during blind transfers may cause a crash 
  770. scsiRequiresHandshake            EQU        $0008                ; Non-handshaked delays or disconnects during blind transfers may cause data corruption 
  771. scsiTargetDrivenSDTRSafe        EQU        $0010                ; Targets which initiate synchronous negotiations are supported 
  772.  
  773. ; scsiHBAslotType values 
  774. scsiMotherboardBus                EQU        $01                    ; A built in Apple supplied bus                     
  775. scsiNuBus                        EQU        $02                    ; A SIM on a NuBus card                             
  776. scsiPDSBus                        EQU        $03                    ;    "  on a PDS card                                
  777. scsiPCIBus                        EQU        $04                    ;    "  on a PCI bus card                            
  778. scsiPCMCIABus                    EQU        $05                    ;    "  on a PCMCIA card                            
  779. scsiFireWireBridgeBus            EQU        $06                    ;    "  connected through a FireWire bridge        
  780.  
  781. ; Defines for the scsiDriverFlags field (in SCSIDriverPB) 
  782. scsiDeviceSensitive                EQU        $0001                ; Only driver should access this device                
  783. scsiDeviceNoOldCallAccess        EQU        $0002                ; no old call access to this device                     
  784.  
  785. ;  SIMInitInfo PB 
  786. ; directions are for SCSIRegisterBus call ( -> parm, <- result)             
  787. SIMInitInfo             RECORD    0
  788. SIMstaticPtr             ds.l    1                                    ; <- alloc. ptr to the SIM's static vars                 
  789. staticSize                 ds.l    1                                    ; -> num bytes SIM needs for static vars                 
  790. SIMInit                     ds.l    1                                    ; -> pointer to the SIM init routine                     
  791. SIMAction                 ds.l    1                                    ; -> pointer to the SIM action routine                 
  792. SIM_ISR                     ds.l    1                                    ;       reserved                                             
  793. SIMInterruptPoll         ds.l    1                                    ; -> pointer to the SIM interrupt poll routine            
  794. NewOldCall                 ds.l    1                                    ; -> pointer to the SIM NewOldCall routine                
  795. ioPBSize                 ds.w    1                                    ; -> size of SCSI_IO_PBs required for this SIM            
  796. oldCallCapable             ds.b    1                                    ; -> true if this SIM can handle old-API calls            
  797. simInfoUnused1             ds.b    1                                    ;       reserved                                            
  798. simInternalUse             ds.l    1                                    ; xx not affected or viewed by XPT                        
  799. XPT_ISR                     ds.l    1                                    ;    reserved                                            
  800. EnteringSIM                 ds.l    1                                    ; <- ptr to the EnteringSIM routine                    
  801. ExitingSIM                 ds.l    1                                    ; <- ptr to the ExitingSIM routine                        
  802. MakeCallback             ds.l    1                                    ; <- the XPT layer’s SCSIMakeCallback routine            
  803. busID                     ds.w    1                                    ; <- bus number for the registered bus                    
  804. simInfoUnused3             ds.w    1                                    ; <- reserved                                            
  805. simInfoUnused4             ds.l    1                                    ; <- reserved                                            
  806. sizeof                     EQU    60
  807.                         ENDR
  808.  
  809. ; Glue between SCSI calls and SCSITrap format 
  810.  
  811. xptSCSIAction                    EQU        $0001
  812. xptSCSIRegisterBus                EQU        $0002
  813. xptSCSIDeregisterBus            EQU        $0003
  814. xptSCSIReregisterBus            EQU        $0004
  815. xptSCSIKillXPT                    EQU        $0005                ; kills Mini-XPT after transition 
  816. xptSCSIInitialize                EQU        $000A                ; Initialize the SCSI manager 
  817.  
  818. ; moveq #kSCSIx, D0;  _SCSIAtomic 
  819.     IF GENERATING68K THEN
  820.         Macro
  821.         _SCSIAction
  822.             moveq    #1,d0
  823.             dc.w     $A089
  824.         EndM
  825.     ELSE
  826.         IMPORT    SCSIAction
  827.     ENDIF
  828.  
  829.     IF GENERATING68K THEN
  830.         Macro
  831.         _SCSIRegisterBus
  832.             moveq    #2,d0
  833.             dc.w     $A089
  834.         EndM
  835.     ELSE
  836.         IMPORT    SCSIRegisterBus
  837.     ENDIF
  838.  
  839.     IF GENERATING68K THEN
  840.         Macro
  841.         _SCSIDeregisterBus
  842.             moveq    #3,d0
  843.             dc.w     $A089
  844.         EndM
  845.     ELSE
  846.         IMPORT    SCSIDeregisterBus
  847.     ENDIF
  848.  
  849.     IF GENERATING68K THEN
  850.         Macro
  851.         _SCSIReregisterBus
  852.             moveq    #4,d0
  853.             dc.w     $A089
  854.         EndM
  855.     ELSE
  856.         IMPORT    SCSIReregisterBus
  857.     ENDIF
  858.  
  859.     IF GENERATING68K THEN
  860.         Macro
  861.         _SCSIKillXPT
  862.             moveq    #5,d0
  863.             dc.w     $A089
  864.         EndM
  865.     ELSE
  866.         IMPORT    SCSIKillXPT
  867.     ENDIF
  868.  
  869.     ENDIF ; __SCSI__
  870.